#include"../../include/perspective/perspective.hpp"
#include<vector>
#include<DirectXMath.h>

// 进行一切的矩阵计算，都在这了
using namespace DirectX;
using namespace std;

namespace SoftEngine{
    // 将三维坐标简单的投影到二维平面,并得到二维坐标
    vector<XMFLOAT2> Calculater::linearInterpolation(vector<XMFLOAT3> allDot,int distance){
        vector<XMFLOAT2> planeDot(0);
        for (auto dot : allDot)
        {
            planeDot.push_back(dotLinearInterpolation(dot,distance));
        }
        return planeDot;
    }
    // 三维坐标投影到二维
    XMFLOAT2 Calculater::dotLinearInterpolation(XMFLOAT3 dot,int distance){
        XMFLOAT2 planeDot(0.0f,0.0f);
        planeDot.x=(distance*dot.x)/dot.y;
        planeDot.y=(distance*dot.z)/dot.y;
        return planeDot;
    }
    // 我所建立的坐标系和windows的api所设计的坐标系并不相同，需要进行坐标系转换
    void Calculater::CoordinateConversion(vector<XMFLOAT2>& alldot,int width,int height){
        // 这里应该切记C++的特性，应该使用auto& 而不是auto，不然会导致原vector不受影响
        for (auto& dot : alldot){
            dot.x+=(width/2);
            dot.y=(height/2)-dot.y;
        }
    }
    void Calculater::CoordinateConversionDepth(vector<DirectX::XMFLOAT3>& alldot, int width, int height){
        // 这里应该切记C++的特性，应该使用auto& 而不是auto，不然会导致原vector不受影响
        for (auto& dot : alldot){
            dot.x+=(width/2);
            dot.y=(height/2)-dot.y;
        }
    }
    // 将三维坐标简单的投影到二维平面,并得到二维坐标,并且保留z的信息，这样就能保持住深度信息
    void Calculater::linearInterpolationDepth(vector<XMFLOAT3>& allDot,int distance){
        for (auto& dot : allDot)
        {
            Calculater::dotLinearInterpolationDepth(dot,distance);
        }
    }
    // 三维坐标投影到二维，需要注意的是，从这里开始，z的含义就发生了改变。
    void Calculater::dotLinearInterpolationDepth(XMFLOAT3& dot,int distance){
        dot.x=(distance*dot.x)/dot.y;
        dot.y=(distance*dot.z)/dot.y;
        return;
    }

}